package org.hamcrest.generator;
import java.io.IOException;
import java.io.StringWriter;
import junit.framework.TestCase;
public class HamcrestFactoryWriterTest extends TestCase {
private FactoryWriter factoryWriter;
private StringWriter output = new StringWriter();
@Override
protected void setUp() throws Exception {
super.setUp();
factoryWriter = new HamcrestFactoryWriter(null, null, output);
}
public void testWritesMethodDelegationMethod() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "anyObject", "matcher.ReturnType");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static matcher.ReturnType anyObject() {\n" +
" return com.example.MyMatcher.anyObject();\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesCompleteJavaSource() throws IOException {
factoryWriter = new HamcrestFactoryWriter("com.some.package", "SomeClass", output);
factoryWriter.writeHeader();
factoryWriter.writeMethod("method1", new FactoryMethod("com.example.MyMatcher", "method1", "matcher.ReturnType"));
factoryWriter.writeMethod("method2", new FactoryMethod("com.example.MyMatcher", "method2", "matcher.ReturnType"));
factoryWriter.writeFooter();
assertEquals("" +
"// Generated source.\n" +
"package com.some.package;\n" +
"\n" +
"public class SomeClass {\n" +
"\n" +
" public static matcher.ReturnType method1() {\n" +
" return com.example.MyMatcher.method1();\n" +
" }\n" +
"\n" +
" public static matcher.ReturnType method2() {\n" +
" return com.example.MyMatcher.method2();\n" +
" }\n" +
"\n" +
"}\n",
output.toString());
}
public void testWritesGenerifiedMatcherType() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "anyString", "matcher.ReturnType");
method.setGenerifiedType("String");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static matcher.ReturnType<String> anyString() {\n" +
" return com.example.MyMatcher.anyString();\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesAdvancedGenerifiedMatcherType() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "weirdThing", "matcher.ReturnType");
method.setGenerifiedType("java.util.Map<com.Foo<Cheese>,?>");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static matcher.ReturnType<java.util.Map<com.Foo<Cheese>,?>> weirdThing() {\n" +
" return com.example.MyMatcher.weirdThing();\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesParameters() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "between", "matcher.ReturnType");
method.addParameter("int[]", "lower");
method.addParameter("com.blah.Cheesable<Long>...", "upper");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static matcher.ReturnType between(int[] lower, com.blah.Cheesable<Long>... upper) {\n" +
" return com.example.MyMatcher.between(lower, upper);\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesExceptions() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "tricky", "matcher.ReturnType");
method.addException("java.io.IOException");
method.addException("com.foo.CheeselessException");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static matcher.ReturnType tricky() throws java.io.IOException, com.foo.CheeselessException {\n" +
" return com.example.MyMatcher.tricky();\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesGenericTypeParameters() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "tricky", "matcher.ReturnType");
method.addGenericTypeParameter("T");
method.addGenericTypeParameter("V extends String & Cheese");
method.addParameter("T", "t");
method.addParameter("List<V>", "v");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" public static <T, V extends String & Cheese> matcher.ReturnType tricky(T t, List<V> v) {\n" +
" return com.example.MyMatcher.<T,V>tricky(t, v);\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesJavaDoc() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "needsDoc", "matcher.ReturnType");
method.setJavaDoc("This is a complicated method.\nIt needs docs.\n\n@see MoreStuff");
factoryWriter.writeMethod(method.getName(), method);
assertEquals("" +
" /**\n" +
" * This is a complicated method.\n" +
" * It needs docs.\n" +
" * \n" +
" * @see MoreStuff\n" +
" */\n" +
" public static matcher.ReturnType needsDoc() {\n" +
" return com.example.MyMatcher.needsDoc();\n" +
" }\n" +
"\n",
output.toString());
}
public void testWritesMethodWithNameOverriden() throws IOException {
FactoryMethod method = new FactoryMethod("com.example.MyMatcher", "eq", "matcher.ReturnType");
factoryWriter.writeMethod("anotherName", method);
assertEquals("" +
" public static matcher.ReturnType anotherName() {\n" +
" return com.example.MyMatcher.eq();\n" +
" }\n" +
"\n",
output.toString());
}
}